package main

import "fmt"

/*
现有技术解决的缺点分析
1、使用变量或者数组来解决问题，不利于数据的管理和维护，因为名字、年龄和颜色都是属于一只猫，但是这里是分开保存
2、如果希望对一只猫的属性（名字、年龄、颜色）进行操作（绑定方法），也不好处理
3、引出新的技术->结构体
*/
/*
1、结构体
一个程序就是一个世界，有很多对象(变量)
2、面向对象编程说明
(1)go也支持面向对象编程(OOP)，但是和传统的面向对象编程有区别，并不是纯粹的面向对象语言，所以说go支持面向对象编程特性是比较准确的
(2)go没有类(class)，go语言的结构体(struct)和其它编程语言的类(class)有同等的地位，可以理解为go是基于struct来实现OOP特性的
(3)go面向对象编程非常简洁，去掉了传统OOP语言的继承、方法重载、构造函数和析构函数、隐藏的this指针等等
(4)go仍然有面向对象编程的继承，封装和多态的特性，只是实现的方式和其它OOP语言不一样，比如继承：go没有extends关键字，继承是通过匿名字段来实现
(5)go面向对象(OOP)很优雅，OOP本身就是语言类型系统(type system)的一部分，通过接口(interface)关联，耦合性低，也非常灵活，go中面向接口编程是非常重要的特性
*/
/*
(1)将一类事物的特性提取出来(比如猫类)，形成一个新的数据类型，就是一个结构体
(2)通过这个结构体，可以创建多个变量（实例/对象）
(3)事物可以猫类，也可以是Person，Fish或者某个工具类
*/
/*
1、结构体是自定义的数据类型，代表一类事物
2、结构体变量(实例)是具体的，实际的，代表一个具体变量
*/
//定义一个Cat结构体，将Cat的各个字段/属性信息，放入到Cat结构体进行管理
type Cat struct {
	Name  string
	Age   int
	Color string
}

func main() {
	//创建一个Cat的变量
	var cat1 Cat
	cat1.Name = "小白"
	cat1.Age = 3
	cat1.Color = "白色"
	fmt.Println("cat1=", cat1)
	fmt.Println("猫猫的信息如下：")
	fmt.Println("Name=", cat1.Name)
	fmt.Println("Age=", cat1.Age)
	fmt.Println("Color=", cat1.Color)
}
